/**
 * 
 */
package fr.gfi.agraf.persistence.dao.impl;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.persistence.NoResultException;
import javax.persistence.TemporalType;

import org.apache.log4j.Logger;
import org.springframework.stereotype.Repository;
import org.springframework.util.CollectionUtils;

import fr.gfi.agraf.persistence.dao.ITacheDAO;
import fr.gfi.agraf.persistence.entity.Tache;
import fr.gfi.agraf.utils.PropertiesUtils;

/**
 * @author Zakaria
 * 
 */
@Repository
public class TacheDAO extends AbstractGenericDAO<Tache> implements ITacheDAO {

	private static final String DATE = "date";
	private static final String ID_TACHES = "idTaches";
	private static final String HQL_TACHE_SELECT_BY_IDS = "hql.tache.selectByIds";
	private static final String DATE_SAISIE = "dateSaisie";
	private static final String HQL_TACHE_SELECT_BY_DATE_AND_UTILISATEUR = "hql.tache.selectByDateAndUtilisateur";
	private static final String ID_UTILISATEUR2 = "idUtilisateur";
	private static final String ID_ACTIVITE = "idActivite";
	private static final String HQL_TACHE_SELECT_BY_ACTIVITE_AND_UTILISATEUR = "hql.tache.selectByActiviteAndUtilisateur";
	private static final String HQL_TACHE_SELECT_ACTIF_BY_UTILISATEUR_ID = "hql.tache.selectActifByUtilisateurId";
	private static final String ID_UTILISATEUR = ID_UTILISATEUR2;

	private static final String HQL_TACHE_SELECT_CREEE_BY_ACTIVITE = "hql.tache.selectTachesCreesByActivite";
	private static final String HQL_TACHE_SELECT_TERMINEE_BY_UTILISATEUR_ID = "hql.tache.selectTachesTermineesByUtilisateur";
	/**
	 * Logger
	 */
	private final static Logger LOGGER = Logger.getLogger(TacheDAO.class);

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * fr.gfi.agraf.persistence.dao.ITacheDAO#getTacheActiveByUtilisateurId(
	 * java.lang.Long)
	 */
	public List<Tache> getTachesActiveByUtilisateurId(final Long idUtilisateur) {
		List<Tache> tacheList = null;
		// Récupere la requete dans le fichier properties
		final String query = PropertiesUtils
				.getProperty(HQL_TACHE_SELECT_ACTIF_BY_UTILISATEUR_ID);
		try {
			// Execute la query
			tacheList = em.createQuery(query, Tache.class)
					.setParameter(ID_UTILISATEUR, idUtilisateur)
					.getResultList();
		} catch (final NoResultException e) {
			LOGGER.error(e);
		}
		return tacheList;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * fr.gfi.agraf.persistence.dao.ITacheDAO#getTachesByActiviteAndUtilisateur
	 * (java.lang.Long, java.lang.Long)
	 */
	public List<Tache> getTachesByActiviteAndUtilisateur(final Long idActivite,
			final Long idUtilisateur, final Date date) {
		List<Tache> tacheList = null;
		try {
			final String query;
			if (idUtilisateur == null) {
				// Récupere la requete dans le fichier properties
				query = PropertiesUtils
						.getProperty(HQL_TACHE_SELECT_CREEE_BY_ACTIVITE);
				// Execute la query
				tacheList = em.createQuery(query, Tache.class)
						.setParameter(ID_ACTIVITE, idActivite).getResultList();
			} else {
				// Récupere la requete dans le fichier properties
				query = PropertiesUtils
						.getProperty(HQL_TACHE_SELECT_BY_ACTIVITE_AND_UTILISATEUR);
				// Execute la query
				tacheList = em.createQuery(query, Tache.class)
						.setParameter(ID_ACTIVITE, idActivite)
						.setParameter(ID_UTILISATEUR2, idUtilisateur)
						.setParameter(DATE, date, TemporalType.DATE)
						.getResultList();
			}
		} catch (final NoResultException e) {
			LOGGER.error(e);
		}
		return tacheList;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * fr.gfi.agraf.persistence.dao.ITacheDAO#getTachesBySaisieDateAndUtilisateur
	 * (java.lang.Long, java.util.Date)
	 */
	public List<Tache> getTachesBySaisieDateAndUtilisateur(
			final Long idUtilisateur, final Date date) {
		List<Tache> tacheList = null;
		// Récupere la requete dans le fichier properties
		final String query = PropertiesUtils
				.getProperty(HQL_TACHE_SELECT_BY_DATE_AND_UTILISATEUR);
		try {
			// Execute la query
			tacheList = em.createQuery(query, Tache.class)
					.setParameter(ID_UTILISATEUR, idUtilisateur)
					.setParameter(DATE_SAISIE, date, TemporalType.DATE)
					.getResultList();
		} catch (final NoResultException e) {
			LOGGER.error(e);
		}
		return tacheList;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * fr.gfi.agraf.persistence.dao.ITacheDAO#getTachesMapByIds(java.util.List)
	 */
	public Map<Long, Tache> getTachesMapByIds(final List<Long> idTacheList) {
		final Map<Long, Tache> tacheMap = new HashMap<Long, Tache>();
		List<Tache> tacheList = null;
		// Récupere la requete dans le fichier properties
		final String query = PropertiesUtils
				.getProperty(HQL_TACHE_SELECT_BY_IDS);
		try {
			// Execute la query
			tacheList = em.createQuery(query, Tache.class)
					.setParameter(ID_TACHES, idTacheList).getResultList();
		} catch (final NoResultException e) {
			LOGGER.error(e);
		}
		if (!CollectionUtils.isEmpty(tacheList)) {
			for (final Tache tache : tacheList) {
				tacheMap.put(tache.getId(), tache);
			}
		}
		return tacheMap;
	}

	public List<Tache> getListeTacheTermineeByUtilisateur(
			final Long idUtilisateur) {
		List<Tache> tacheList = null;
		// Récupere la requete dans le fichier properties
		final String query = PropertiesUtils
				.getProperty(HQL_TACHE_SELECT_TERMINEE_BY_UTILISATEUR_ID);
		try {
			// Execute la query
			tacheList = em.createQuery(query, Tache.class)
					.setParameter(ID_UTILISATEUR, idUtilisateur)
					.getResultList();
		} catch (final NoResultException e) {
			LOGGER.error(e);
		}
		return tacheList;
	}

}
